package com.youpingou.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 主要是将目前的类定义成一个websocket服务器端, 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 */
@ServerEndpoint("/websocket/{sn}")
@Slf4j
@Component
public class Websocket {
    //静态变量，用来记录当前在线连接数。设计为安全的
    //private static int onlineCount = 0;
    //concurrentHashMap分段锁，用来存放每个客户端对应的Websocket对象。
    private static Map<String, Websocket> clients = new HashMap<String, Websocket>();
    //与某个客户端的连接会话，需要通过它来给客户端发送数据
    private Session session;
    private String sn;
 
    /**
     * 连接建立成功调用的方法
     * @param sn
     * @param session
     */
    @OnOpen
    public void onOpen(@PathParam("sn") String sn, Session session) {
        this.sn = sn;
        this.session = session;
//        Websocket.onlineCount++;
//        log.info("有一连接进入！当前在线人数为" + onlineCount);
        clients.put(sn, this);
    }
 
    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        clients.remove(sn);
//        Websocket.onlineCount--;
//        log.info("有一连接关闭！当前在线人数为" + onlineCount);
 
    }
 
    /**
     * 收到客户端消息后调用的方法
     */
//    @OnMessage
//    public void onMessage(String sn,String message) {
//        System.out.println("收到客户端的消息"+message);
//        sendMessage(sn,message);
//    }
 
    @OnError
    public void onError(Session session, Throwable throwable) {
        log.error("WebSocket发生错误：" + throwable.getMessage());
    }
 
    public static void sendMessage(String sn,String message) {
        // 向所有连接websocket的客户端发送消息
        // 可以修改为对某个客户端发消息
//        for (Websocket item : clients.values()) {
//
//            item.session.getAsyncRemote().sendText(message);
//        }
        for (String ssn : clients.keySet()) {
            if (ssn.equals(sn)){
                System.out.println("ssn:"+ssn);
                System.out.println("sb:"+sn);
                Websocket item = clients.get(ssn);
                item.session.getAsyncRemote().sendText(message);
            }
        }
    }
}